package u2

import (
	"log"
	"strconv"
	"time"
)

type TimeParse int64

// TimeNow 获取当前时间的TimeParse对象
//
// 返回值：
//
//	TimeParse - 表示当前时间的TimeParse对象
//
// 注意：
//
//	使用time.Now().UnixNano()获取当前时间的纳秒表示
//
// 示例：
//
//	now := TimeNow() // 返回当前时间的TimeParse对象
func TimeNow() TimeParse {
	return TimeParse(time.Now().UnixNano())
}

// TimeCommon 根据纳秒时间戳创建TimeParse对象
//
// 参数：
//
//	t - 纳秒级时间戳
//
// 返回值：
//
//	TimeParse - 表示指定时间的TimeParse对象
//
// 示例：
//
//	tp := TimeCommon(1672531200000000000) // 创建表示2023-01-01 00:00:00的TimeParse对象
func TimeCommon(t int64) TimeParse {
	return TimeParse(t)
}

// TimeFormat 根据格式化的时间字符串创建TimeParse对象
//
// 参数：
//
//	format - 格式化的时间字符串，格式为"2006-01-02 15:04:05"
//
// 返回值：
//
//	TimeParse - 表示指定时间的TimeParse对象
//
// 注意：
//  1. 如果解析失败，会使用当前时间并记录错误日志
//  2. 使用time.Parse进行解析
//
// 示例：
//
//	tp := TimeFormat("2023-01-01 12:00:00") // 创建表示2023-01-01 12:00:00的TimeParse对象
func TimeFormat(format string) TimeParse {
	t, err := time.Parse("2006-01-02 15:04:05", format)
	if err != nil {
		log.Println(err)
		t = time.Now()
	}
	return TimeParse(t.UnixNano())
}

// Add 为TimeParse对象增加指定的时间间隔
//
// 参数：
//
//	d - 要增加的时间间隔
//
// 返回值：
//
//	TimeParse - 增加时间间隔后的新TimeParse对象
//
// 示例：
//
//	newTime := tp.Add(time.Hour) // 增加1小时
func (t TimeParse) Add(d time.Duration) TimeParse {
	return TimeParse(int64(t) + int64(d))
}

// Unix 获取TimeParse对象的秒级时间戳
//
// 返回值：
//
//	int64 - 秒级时间戳
//
// 示例：
//
//	timestamp := tp.Unix() // 返回秒级时间戳
func (t TimeParse) Unix() int64 {
	return int64(t) / 1e9
}

// Unix 获取TimeParse对象的秒级时间戳
//
// 返回值：
//
//	int64 - 秒级时间戳
//
// 示例：
//
//	timestamp := tp.Unix() // 返回秒级时间戳
func (t TimeParse) Unix2String() string {
	return strconv.FormatInt(t.Unix(), 10)
}

// UnixNano 获取TimeParse对象的纳秒级时间戳
//
// 返回值：
//
//	int64 - 纳秒级时间戳
//
// 示例：
//
//	nano := tp.UnixNano() // 返回纳秒级时间戳
func (t TimeParse) UnixNano() int64 {
	return int64(t)
}

// UnixMilli 获取TimeParse对象的毫秒级时间戳
//
// 返回值：
//
//	int64 - 毫秒级时间戳
//
// 示例：
//
//	milli := tp.UnixMilli() // 返回毫秒级时间戳
func (t TimeParse) UnixMilli() int64 {
	return int64(t) / 1e6
}

// UnixMilli 获取TimeParse对象的毫秒级时间戳
//
// 返回值：
//
//	int64 - 毫秒级时间戳
//
// 示例：
//
//	milli := tp.UnixMilli() // 返回毫秒级时间戳
func (t TimeParse) UnixMilli2Strig() string {
	return strconv.FormatInt(t.UnixMilli(), 10)
}

// TimeFormat 将TimeParse对象格式化为指定格式的字符串
//
// 参数：
//
//	format - 时间格式字符串
//
// 返回值：
//
//	string - 格式化后的时间字符串
//
// 示例：
//
//	str := tp.TimeFormat("2006-01-02") // 返回"2023-01-01"
func (t TimeParse) TimeFormat(format string) string {
	return time.Unix(t.Unix(), 0).Format(format)
}

// TimeFormatDefault 将TimeParse对象格式化为默认格式的字符串
//
// 返回值：
//
//	string - 格式化后的时间字符串，格式为"2006-01-02 15:04:05"
//
// 示例：
//
//	str := tp.TimeFormatDefault() // 返回"2023-01-01 12:00:00"
func (t TimeParse) TimeFormatDefault() string {
	return time.Unix(t.Unix(), 0).Format("2006-01-02 15:04:05")
}

// DayStart 获取TimeParse对象所在天的开始时间
//
// 返回值：
//
//	TimeParse - 表示当天00:00:00的TimeParse对象
//
// 示例：
//
//	start := tp.DayStart() // 返回当天00:00:00的TimeParse对象
func (t TimeParse) DayStart() TimeParse {
	tt := time.Unix(t.Unix(), 0)
	return TimeParse(time.Date(tt.Year(), tt.Month(), tt.Day(), 0, 0, 0, 0, tt.Location()).UnixNano())
}

// DayEnd 获取TimeParse对象所在天的结束时间
//
// 返回值：
//
//	TimeParse - 表示当天23:59:59.99的TimeParse对象
//
// 示例：
//
//	end := tp.DayEnd() // 返回当天23:59:59.99的TimeParse对象
func (t TimeParse) DayEnd() TimeParse {
	tt := time.Unix(t.Unix(), 0)
	return TimeParse(time.Date(tt.Year(), tt.Month(), tt.Day(), 23, 59, 59, 99, tt.Location()).UnixNano())
}
